package main

import (
	//"flag"
	"strings"
	"strconv"
	"flag"
	"net/url"
	"math/rand"
	"os"
)

type resource struct {
	url string
	target string
	start int
	end int
}

func rule() []resource{
	var res  []resource
	r1 := resource{
		url:"http://localhost:8000/",
		target:"",
		start:0,
		end:0,
	}
	r2:= resource{
		url:"http://localhost:8000/list/${id}.html",
		target:"${id}",
		start:1,
		end:21,
	}
	r3:=resource{
		url:"http://localhost:8000/movie/${id}.html",
		target:"${id}",
		start:1,
		end:12924,
	}
	res=append(res,r1,r2,r3)
	return res
}


func main() {
	total:=flag.Int("total",1000,"rows to mock")
	path :=flag.String("path","/Users/shuchang/Documents/nginx/logs/digs.log","file path")
	flag.Parse()
	//构造真是网址集合
	res := rule()
	list:=build(res,1)

	for j:=0;j<2000;j++ {
		var logStr string
		for i := 0; i < *total; i++ {
			currentUrl := list[rand.Intn(len(list)-1)]
			referUrl := list[rand.Intn(len(list)-1)]
			ua := uaList[rand.Intn(len(uaList)-1)]
			logStr = logStr + makelog(currentUrl, referUrl, ua) + "\n"
		}
		fd, _ := os.OpenFile(*path, os.O_APPEND|os.O_RDWR, 06444)
		fd.WriteString(logStr)
		 fd.Close()
	}
}
func makelog(curr, refer, ua string) string {
	u:=url.Values{}
	u.Set("time","1")
	u.Set("url",curr)
	u.Set("refer",refer)
	u.Set("ua",ua)
	encode := u.Encode()
	logTemplate := "127.0.0.1 - - [29/Jun/2018:14:26:18 +0800] \"GET /dig?${paramStr} HTTP/1.1\" 200 43 \"-\" \"${ua}\" \"-\""
	log:=strings.Replace(logTemplate,"${paramStr}",encode,-1)
	log=strings.Replace(log,"${ua}",ua,-1)
	return log
}
func build(resources []resource,total int) []string {
	var list  []string
	for _,item :=range resources{
		if len(item.target)==0{
			list = append(list, item.url)
		}else{
			for i:=item.start;i<=item.end;i++{
				url:=strings.Replace(item.url,item.target,strconv.Itoa(i),-1)
				list = append(list, url)
			}
		}
	}
	return list
}


var uaList = []string{
	"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
	"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
	"Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
	"Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
	"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
	"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
	"Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
	"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
	"Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
	"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
	"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
	"Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",
	"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
	"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
	"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20",
	"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
}